--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / plugins / PluginHost.js
Displaying Raw • Download
meshchatx/src/frontend/js/plugins/PluginHost.js eca1486f3c00aeb0b97d7199ccc03b929d9619f1 (eca1486f) Text, 6.37 KB
T8b949e// SPDX-License-Identifier: 0BSD
Tff7b72import Tb4b4b4{ Te6edf3validatePluginManifest Tb4b4b4} Tff7b72from Ta5d6ff"./pluginManifest.js"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3registerNavItemTb4b4b4, Te6edf3unregisterNavItem Tb4b4b4} Tff7b72from Ta5d6ff"../registries/navRegistry.js"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3registerToolTb4b4b4, Te6edf3unregisterTool Tb4b4b4} Tff7b72from Ta5d6ff"../registries/toolsRegistry.js"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3onWsEventTb4b4b4, Te6edf3offWsEvent Tb4b4b4} Tff7b72from Ta5d6ff"../registries/wsEventRegistry.js"Tb4b4b4;
T8b949e/** @typedef {import('./pluginManifest.js').PluginManifest} PluginManifest */
Tff7b72export Tff7b72class Te6edf3PluginHost Tb4b4b4{
Tff7b72constructorTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e/** @type {Map<string, { worker: Worker, cleanup: Array<() => void>, manifest: PluginManifest }>} */
Tff7b72thisTb4b4b4.Te6edf3instances Tff7b72= Tff7b72new Tffa657MapTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Te6edf3loadEnabledPluginsTb4b4b4(Te6edf3apiClientTb4b4b4, Te6edf3labels Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Te6edf3apiClientTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"/api/v1/plugins"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3plugins Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3plugins Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3plugin Tff7b72of Te6edf3pluginsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3pluginTb4b4b4.Te6edf3enabledTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3loadPluginTb4b4b4(Te6edf3pluginTb4b4b4, Te6edf3apiClientTb4b4b4, Te6edf3labelsTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* @param {Record<string, unknown>} plugin
* @param {ReturnType<import('../apiClient.js').createApiClient>} apiClient
*/
Tff7b72async Te6edf3loadPluginTb4b4b4(Te6edf3pluginTb4b4b4, Te6edf3apiClientTb4b4b4, Te6edf3labels Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3pluginId Tff7b72= Te6edf3pluginTb4b4b4.Te6edf3idTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3instancesTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3pluginIdTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3manifest Tff7b72= Te6edf3validatePluginManifestTb4b4b4(Te6edf3pluginTb4b4b4.Te6edf3manifestTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3manifestTb4b4b4.Te6edf3frontendTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3assetUrl Tff7b72= Ta5d6ff`Ta5d6ff/api/v1/plugins/Tffd700${Tffa657encodeURIComponentTb4b4b4(Te6edf3pluginIdTb4b4b4)Tffd700}Ta5d6ff/asset/Tffd700${Te6edf3manifestTb4b4b4.Te6edf3frontendTb4b4b4.Te6edf3entryTffd700}Ta5d6ff`Tb4b4b4;
Tff7b72const Te6edf3sourceResponse Tff7b72= Tff7b72await Te6edf3apiClientTb4b4b4.Te6edf3getTb4b4b4(Te6edf3assetUrlTb4b4b4, Tb4b4b4{ Te6edf3responseTypeTff7b72: Ta5d6ff"text" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3source Tff7b72= Tff7b72typeof Te6edf3sourceResponseTb4b4b4.Te6edf3data Tff7b72=== Ta5d6ff"string" Tff7b72? Te6edf3sourceResponseTb4b4b4.Te6edf3data Tff7b72: Tffa657StringTb4b4b4(Te6edf3sourceResponseTb4b4b4.Te6edf3data Tff7b72?? Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3worker Tff7b72= Tff7b72new Te6edf3WorkerTb4b4b4(Tff7b72new Te6edf3URLTb4b4b4(Ta5d6ff"./pluginWorker.js"Tb4b4b4, Tff7b72importTb4b4b4.Te6edf3metaTb4b4b4.Te6edf3urlTb4b4b4)Tb4b4b4, Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"module" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cleanup Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Te6edf3workerTb4b4b4.Te6edf3onmessage Tff7b72= Tb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3handleWorkerMessageTb4b4b4(Te6edf3pluginIdTb4b4b4, Te6edf3eventTb4b4b4.Te6edf3dataTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3workerTb4b4b4.Te6edf3onerror Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3unloadPluginTb4b4b4(Te6edf3pluginIdTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3workerTb4b4b4.Te6edf3postMessageTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"init"Tb4b4b4,
Te6edf3pluginIdTb4b4b4,
Te6edf3permissionsTff7b72: Te6edf3manifestTb4b4b4.Te6edf3permissions Tff7b72|| Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3sourceTb4b4b4,
Te6edf3labelsTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3cleanupTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3registerContributionsTb4b4b4(Te6edf3pluginIdTb4b4b4, Te6edf3manifestTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3manifestTb4b4b4.Te6edf3permissionsTff7b72?Tb4b4b4.Te6edf3hooks Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3eventHandler Tff7b72= Tb4b4b4(Te6edf3payloadTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3payloadTff7b72?Tb4b4b4.Te6edf3plugin_id Tff7b72!== Te6edf3pluginIdTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3workerTb4b4b4.Te6edf3postMessageTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"event"Tb4b4b4,
Te6edf3eventTff7b72: Te6edf3payloadTff7b72?Tb4b4b4.Te6edf3eventTb4b4b4,
Te6edf3payloadTff7b72: Te6edf3payloadTff7b72?Tb4b4b4.Te6edf3payloadTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3onWsEventTb4b4b4(Ta5d6ff"plugin.event"Tb4b4b4, Te6edf3eventHandlerTb4b4b4)Tb4b4b4;
Te6edf3cleanupTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3offWsEventTb4b4b4(Ta5d6ff"plugin.event"Tb4b4b4, Te6edf3eventHandlerTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3requestHandler Tff7b72= Tff7b72async Tb4b4b4(Te6edf3messageTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3message Tff7b72|| Te6edf3messageTb4b4b4.Te6edf3type Tff7b72!== Ta5d6ff"request"Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72let Te6edf3resultTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3messageTb4b4b4.Te6edf3kind Tff7b72=== Ta5d6ff"invoke"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Te6edf3apiClientTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/plugins/Tffd700${Tffa657encodeURIComponentTb4b4b4(Te6edf3pluginIdTb4b4b4)Tffd700}Ta5d6ff/invokeTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3methodTff7b72: Te6edf3messageTb4b4b4.Te6edf3payloadTb4b4b4.Te6edf3methodTb4b4b4,
Te6edf3argsTff7b72: Te6edf3messageTb4b4b4.Te6edf3payloadTb4b4b4.Te6edf3argsTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3result Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3resultTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3messageTb4b4b4.Te6edf3kind Tff7b72=== Ta5d6ff"manager"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Te6edf3apiClientTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/plugins/Tffd700${Tffa657encodeURIComponentTb4b4b4(Te6edf3pluginIdTb4b4b4)Tffd700}Ta5d6ff/invokeTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3methodTff7b72: Ta5d6ff"callManager"Tb4b4b4,
Te6edf3argsTff7b72: Te6edf3messageTb4b4b4.Te6edf3payloadTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3result Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3resultTb4b4b4;
Tb4b4b4}
Te6edf3workerTb4b4b4.Te6edf3postMessageTb4b4b4(Tb4b4b4{ Te6edf3requestIdTff7b72: Te6edf3messageTb4b4b4.Te6edf3requestIdTb4b4b4, Te6edf3result Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3workerTb4b4b4.Te6edf3postMessageTb4b4b4(Tb4b4b4{
Te6edf3requestIdTff7b72: Te6edf3messageTb4b4b4.Te6edf3requestIdTb4b4b4,
Te6edf3errorTff7b72: Te6edf3errorTff7b72?Tb4b4b4.Te6edf3message Tff7b72|| Tffa657StringTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Te6edf3workerTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"message"Tb4b4b4, Tb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72void Te6edf3requestHandlerTb4b4b4(Te6edf3eventTb4b4b4.Te6edf3dataTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3instancesTb4b4b4.Te6edf3setTb4b4b4(Te6edf3pluginIdTb4b4b4, Tb4b4b4{ Te6edf3workerTb4b4b4, Te6edf3cleanupTb4b4b4, Te6edf3manifest Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {string} pluginId
* @param {PluginManifest} manifest
*/
Te6edf3registerContributionsTb4b4b4(Te6edf3pluginIdTb4b4b4, Te6edf3manifestTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3cleanup Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3contributes Tff7b72= Te6edf3manifestTb4b4b4.Te6edf3contributes Tff7b72|| Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3item Tff7b72of Te6edf3contributesTb4b4b4.Te6edf3navItems Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3registerNavItemTb4b4b4(Tb4b4b4{ Tb4b4b4...Te6edf3itemTb4b4b4, Te6edf3pluginId Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3cleanupTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3unregisterNavItemTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3item Tff7b72of Te6edf3contributesTb4b4b4.Te6edf3toolsPageEntries Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3registerToolTb4b4b4(Tb4b4b4{ Tb4b4b4...Te6edf3itemTb4b4b4, Te6edf3pluginId Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3cleanupTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3unregisterToolTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3cleanupTb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {string} pluginId
* @param {unknown} message
*/
Te6edf3handleWorkerMessageTb4b4b4(Te6edf3pluginIdTb4b4b4, Te6edf3messageTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3message Tff7b72|| Tff7b72typeof Te6edf3message Tff7b72!== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3messageTb4b4b4.Te6edf3type Tff7b72=== Ta5d6ff"ui"Tb4b4b4) Tb4b4b4{
Tffa657windowTb4b4b4.Te6edf3dispatchEventTb4b4b4(
Tff7b72new Te6edf3CustomEventTb4b4b4(Ta5d6ff"meshchatx-plugin-ui"Tb4b4b4, Tb4b4b4{
Te6edf3detailTff7b72: Tb4b4b4{ Te6edf3pluginIdTb4b4b4, Te6edf3descriptorTff7b72: Te6edf3messageTb4b4b4.Te6edf3descriptor Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3messageTb4b4b4.Te6edf3type Tff7b72=== Ta5d6ff"error"Tb4b4b4) Tb4b4b4{
Tffa657windowTb4b4b4.Te6edf3dispatchEventTb4b4b4(
Tff7b72new Te6edf3CustomEventTb4b4b4(Ta5d6ff"meshchatx-plugin-error"Tb4b4b4, Tb4b4b4{
Te6edf3detailTff7b72: Tb4b4b4{ Te6edf3pluginIdTb4b4b4, Te6edf3messageTff7b72: Te6edf3messageTb4b4b4.Te6edf3message Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3unloadPluginTb4b4b4(Te6edf3pluginIdTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3instance Tff7b72= Tff7b72thisTb4b4b4.Te6edf3instancesTb4b4b4.Te6edf3getTb4b4b4(Te6edf3pluginIdTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3instanceTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3instanceTb4b4b4.Te6edf3workerTb4b4b4.Te6edf3terminateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3fn Tff7b72of Te6edf3instanceTb4b4b4.Te6edf3cleanupTb4b4b4) Tb4b4b4{
Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3instancesTb4b4b4.Tff7b72deleteTb4b4b4(Te6edf3pluginIdTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3postActionTb4b4b4(Te6edf3pluginIdTb4b4b4, Te6edf3actionIdTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3instance Tff7b72= Tff7b72thisTb4b4b4.Te6edf3instancesTb4b4b4.Te6edf3getTb4b4b4(Te6edf3pluginIdTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3instanceTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3instanceTb4b4b4.Te6edf3workerTb4b4b4.Te6edf3postMessageTb4b4b4(Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"action"Tb4b4b4, Te6edf3actionId Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3postInputTb4b4b4(Te6edf3pluginIdTb4b4b4, Te6edf3idTb4b4b4, Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3instance Tff7b72= Tff7b72thisTb4b4b4.Te6edf3instancesTb4b4b4.Te6edf3getTb4b4b4(Te6edf3pluginIdTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3instanceTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3instanceTb4b4b4.Te6edf3workerTb4b4b4.Te6edf3postMessageTb4b4b4(Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"input"Tb4b4b4, Te6edf3idTb4b4b4, Te6edf3value Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72export Tff7b72const Te6edf3pluginHost Tff7b72= Tff7b72new Te6edf3PluginHostTb4b4b4(Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────